package juanca.mole;

import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONObject;

import ClasesExtras.AdaptadorMpInspeccionada;
import ClasesExtras.MpInspeccionada;
import ClasesExtras.handlerAlertMessage;
import ClasesExtras.handlerDb;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

import com.savagelook.android.JsonHelper;

public class CtrlManejoFruver extends Activity {

	private int fAno;
	private int fMes;
	private int fDia;
	private int hMinuto;
	private int hHora;
	private Date fechaUsuario;
	private Time tiempoUsuario;
	private Date fechaSistema;
	private Time tiempoSistema;
	private TextView tvMpInspecionada;
	public static final int DATE_DIALOG_ID = 0;
	public static final int TIME_DIALOG_ID = 1;
	private static final String URL_MATERIAS_PRIMAS = "http://10.1.1.174:3000/materias_primas.json";
	private static final String URL_IMP = "http://10.1.1.174:3000/registros_imp.json";
	private static final String URL_REGISTRO_CTRL_FRUVER = "http://10.1.1.174:3000/controles_manejo_fruver.json";
	public static final String STRING_EMPTY = "";
	private int cantinadBna;
	private int cantinadMala;
	private int cantinadPepa;
	private int cantinadPulpa;
	private String matrizIMP[][];
	public HashMap<String, String> mpId;
	private CtrlManejoFruver self = this;

	ArrayList<MpInspeccionada> Lista_MpInspec;
	ListView lvMpInspec;
	AdaptadorMpInspeccionada adaptador;

	private EditText etCantBuena;
	private EditText etCantMala;
	private EditText etCantPepa;
	private EditText etCantPulpa;
	private handlerAlertMessage manejadorMensajes;
	private Activity activity;

	/**
	 * @return the tiempoUsuario
	 */
	public Time getTiempoUsuario() {
		return tiempoUsuario;
	}

	/**
	 * @param tiempoUsuario
	 *            the tiempoUsuario to set
	 */
	public void setTiempoUsuario(Time tiempoUsuario) {
		this.tiempoUsuario = tiempoUsuario;
	}

	/**
	 * @return the fechaUsuario
	 */
	public Date getFechaUsuario() {
		return fechaUsuario;
	}

	/**
	 * @param fechaUsuario
	 *            the fechaUsuario to set
	 */
	public void setFechaUsuario(Date fechaUsuario) {
		this.fechaUsuario = fechaUsuario;
	}

	/**
	 * @return the tiempoSistema
	 */
	public Time getTiempoSistema() {
		return tiempoSistema;
	}

	/**
	 * @param tiempoSistema
	 *            the tiempoSistema to set
	 */
	public void setTiempoSistema(Time tiempoSistema) {
		this.tiempoSistema = tiempoSistema;
	}

	/**
	 * @return the fechaSistema
	 */
	public Date getFechaSistema() {
		return fechaSistema;
	}

	/**
	 * @param fechaSistema
	 *            the fechaSistema to set
	 */
	public void setFechaSistema(Date fechaSistema) {
		this.fechaSistema = fechaSistema;
	}

	/**
	 * @return the cantinadPulpa
	 */
	public int getCantinadPulpa() {
		return cantinadPulpa;
	}

	/**
	 * @param cantinadPulpa
	 *            the cantinadPulpa to set
	 */
	public void setCantinadPulpa(int cantinadPulpa) {
		this.cantinadPulpa = cantinadPulpa;
	}

	/**
	 * @return the cantinadPepa
	 */
	public int getCantinadPepa() {
		return cantinadPepa;
	}

	/**
	 * @param cantinadPepa
	 *            the cantinadPepa to set
	 */
	public void setCantinadPepa(int cantinadPepa) {
		this.cantinadPepa = cantinadPepa;
	}

	/**
	 * @return the cantinadMala
	 */
	public int getCantinadMala() {
		return cantinadMala;
	}

	/**
	 * @param cantinadMala
	 *            the cantinadMala to set
	 */
	public void setCantinadMala(int cantinadMala) {
		this.cantinadMala = cantinadMala;
	}

	/**
	 * @return the cantinadBna
	 */
	public int getCantinadBna() {
		return cantinadBna;
	}

	/**
	 * @param cantinadBna
	 *            the cantinadBna to set
	 */
	public void setCantinadBna(int cantinadBna) {
		this.cantinadBna = cantinadBna;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_ctrl_manejo_fruver);

		getWindow().setSoftInputMode(
				WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

		tvMpInspecionada = (TextView) findViewById(R.id.tvMpInspecionada);
		etCantBuena = (EditText) findViewById(R.id.etCantBuena);
		etCantMala = (EditText) findViewById(R.id.etCantMala);
		etCantPepa = (EditText) findViewById(R.id.etCantPepa);
		etCantPulpa = (EditText) findViewById(R.id.etCantPulpa);
		lvMpInspec = (ListView) findViewById(R.id.lvMpInspec);

		manejadorMensajes = new handlerAlertMessage();
		activity = this;
		matrizIMP = new String[100][5];

		new Thread(new Runnable() {
			@Override
			public void run() {
				self.cargarIMP(URL_IMP, URL_MATERIAS_PRIMAS);
				Log.e("ServicioRest", "carga IMP");

			}
		}).start();

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.layout_ctrl_manejo_fruver, menu);
		return true;
	}

	@SuppressWarnings("deprecation")
	public void FechaFinCtrlMf(View v) {
		final Calendar c = Calendar.getInstance();
		fAno = c.get(Calendar.YEAR);
		fMes = c.get(Calendar.MONTH);
		fDia = c.get(Calendar.DAY_OF_MONTH);
		showDialog(DATE_DIALOG_ID);
	}

	@SuppressWarnings("deprecation")
	public void HoraFinCtrlMf(View v) {
		final Calendar c = Calendar.getInstance();
		hHora = c.get(Calendar.HOUR_OF_DAY);
		hMinuto = c.get(Calendar.MINUTE);
		showDialog(TIME_DIALOG_ID);

	}

	@SuppressLint("SimpleDateFormat")
	private TimePickerDialog.OnTimeSetListener showtime = new TimePickerDialog.OnTimeSetListener() {

		@SuppressLint("SimpleDateFormat")
		@Override
		public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
			hHora = hourOfDay;
			hMinuto = minute;

			Context context = getApplicationContext();
			CharSequence text = new StringBuilder().append(hHora).append(":")
					.append(hMinuto).append(" ").append(" ");
			int duration = Toast.LENGTH_SHORT;

			Toast toast = Toast.makeText(context, text, duration);
			toast.show();

			SimpleDateFormat formatoTiempo = new SimpleDateFormat("hh:mm");
			String time = (hHora + ":" + hMinuto).toString();

			try {
				Time tiempo = new Time(formatoTiempo.parse(time).getTime());
				setTiempoUsuario(tiempo);

				CharSequence t = "Hora buena";
				toast = Toast.makeText(context, t, duration);
				toast.show();

			} catch (java.text.ParseException e) {
				CharSequence texto = "Error en la Hora";
				toast = Toast.makeText(context, texto, duration);
				toast.show();

			}

		}
	};

	private DatePickerDialog.OnDateSetListener showdate = new DatePickerDialog.OnDateSetListener() {

		@SuppressLint("SimpleDateFormat")
		@Override
		public void onDateSet(DatePicker view, int year, int monthOfYear,
				int dayOfMonth) {
			fAno = year;
			fMes = monthOfYear;
			fDia = dayOfMonth;

			Context context = getApplicationContext();
			CharSequence text = new StringBuilder().append(fDia).append("-")
					.append(fMes + 1).append("-").append(fAno);
			int duration = Toast.LENGTH_SHORT;

			Toast toast = Toast.makeText(context, text, duration);
			toast.show();

			SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
			String date = (fDia + "-" + fMes + "-" + fAno + "-").toString();

			try {
				setFechaUsuario(formatoFecha.parse(date));
				CharSequence texto = "Formtato date";

				toast = Toast.makeText(context, texto, duration);
				toast.show();
			} catch (java.text.ParseException e) {

				CharSequence texto = "Error en la fecha";
				toast = Toast.makeText(context, texto, duration);
				toast.show();

			}

		}
	};

	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case TIME_DIALOG_ID:
			return new TimePickerDialog(this, showtime, hHora, hMinuto, true);

		case DATE_DIALOG_ID:
			return new DatePickerDialog(this, showdate, fAno, fMes, fDia);
		}
		return null;
	}

	// método que captura la fecha y la hora del sistema
	@SuppressLint("SimpleDateFormat")
	public void fechaHoraSistema() {
		final Calendar c = Calendar.getInstance();
		int ano = c.get(Calendar.YEAR);
		int mes = c.get(Calendar.MONTH);
		int dia = c.get(Calendar.DAY_OF_MONTH);
		int hora = c.get(Calendar.HOUR_OF_DAY);
		int minuto = c.get(Calendar.MINUTE);

		Context context = getApplicationContext();
		int duration = Toast.LENGTH_SHORT;
		SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
		SimpleDateFormat formatoTiempo = new SimpleDateFormat("hh:mm");
		String date = (dia + "-" + mes + "-" + ano + "-").toString();
		String time = (hora + ":" + minuto).toString();

		try {
			Time tiempo = new Time(formatoTiempo.parse(time).getTime());
			Date fecha = formatoFecha.parse(date);
			this.setFechaSistema(fecha);
			this.setTiempoSistema(tiempo);

			CharSequence t = "Hora y fecha del sistema buena";
			Toast toast = Toast.makeText(context, t, duration);
			toast.show();

		} catch (java.text.ParseException e) {

			CharSequence texto = "Error en la Hora y en la fecha";
			Toast toast = Toast.makeText(context, texto, duration);
			toast.show();

		}
	}

	// método que lo lleva a la vista de trazabilidad
	public void goTrazabilidad(View view) {
		Intent intent = new Intent();
		intent.setClass(this, Trazabilidad.class);
		startActivity(intent);
	}

	public void RegCtrlMf(View v) {
		this.validar();
		// metodo para registrar los valores y guardarlos en la DB
	}

	// hace validacion
	public void validar() {
		this.fechaHoraSistema();
		if (this.getFechaSistema() != null && this.getTiempoSistema() != null) {
			if (this.getFechaUsuario() != null) {
				if (this.getTiempoUsuario() != null) {

					if (!etCantBuena.getText().toString().equals(STRING_EMPTY))
						this.setCantinadBna(Integer.parseInt(etCantBuena
								.getText().toString()));

					if (!etCantMala.getText().toString().equals(STRING_EMPTY))
						this.setCantinadMala(Integer.parseInt(etCantMala
								.getText().toString()));

					if (!etCantPepa.getText().toString().equals(STRING_EMPTY))
						this.setCantinadPepa(Integer.parseInt(etCantPepa
								.getText().toString()));

					if (!etCantPulpa.getText().toString().equals(STRING_EMPTY))
						this.setCantinadPulpa(Integer.parseInt(etCantPulpa
								.getText().toString()));

					Context context = getApplicationContext();
					CharSequence text = "¡Muy bien!";
					int duration = Toast.LENGTH_SHORT;

					Toast toast = Toast.makeText(context, text, duration);
					toast.show();
				} else {
					// falta la hora
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloAlerta, R.string.msjSelecHora,
							R.string.btnAceptar);
				}
			} else {
				// falta la fecha
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloAlerta, R.string.msjSelecFecha,
						R.string.btnAceptar);
			}
		}
	}

	public void goInspaccionMp(View view) {
		Intent intent = new Intent();
		intent.setClass(this, InspaccionMp.class);
		startActivity(intent);
	}

	public void cargarIMP(String urlImp, String urlMp) {
		this.Lista_MpInspec = new ArrayList<MpInspeccionada>();
		this.adaptador = new AdaptadorMpInspeccionada(this, this.Lista_MpInspec);

		handlerDb handlerdb = new handlerDb(this);
		handlerdb.abrir();
		String numLote = handlerdb.leer("id_proceso");
		handlerdb.cerrar();

		// try que llena la matriz de id,cantidad_mp, materia_prima_id de RIMP
		try {

			JSONArray mpInspected = JsonHelper.getJsonArrayFromUrl(urlImp);

			for (int a = 0; a < mpInspected.length(); a++) {
				JSONObject c = mpInspected.getJSONObject(a);
				this.matrizIMP[a][0] = c.getString("id");// id de imp
				this.matrizIMP[a][1] = c.getString("cantidad_mp"); // cantidad
																	// mp
																	// inspaccionada
				this.matrizIMP[a][2] = c.getString("materia_prima_id");// id de
																		// materia
																		// prima
				this.matrizIMP[a][4] = c.getString("proceso_id"); // id de
																	// proceso

			}
			Log.e("ServicioRest", " carga la mP inspeccionada");

		} catch (Exception e) {
			Log.e("ServicioRest", "no carga la mP inspeccionada");

		}

		// try que completa la matriz de nombre demateria_prima
		try {

			JSONArray mp = JsonHelper.getJsonArrayFromUrl(urlMp);
			for (int j = 0; j < mp.length(); j++) {
				JSONObject m = mp.getJSONObject(j);

				for (int i = 0; i < 99; i++) {
					if (m.getString("id").equals(this.matrizIMP[i][2])) {
						this.matrizIMP[i][3] = m.getString("nombre");// nombre
																		// de
						if (this.matrizIMP[i][0].equals(null)) // materia prima
							i = 100;
					}
				}

			}
			Log.e("ServicioRest", "carga  el nombre de la mP");

		} catch (Exception e) {
			Log.e("ServicioRest", "no carga la mP");

		}
		// se llena el Array de MpInspeccionada
		int h = 0;
		while (self.matrizIMP[h][0] != null) {
			if (self.matrizIMP[h][4].equals(numLote)) {
				if (!self.matrizIMP[h][3].equals(null)) {
					self.Lista_MpInspec.add(new MpInspeccionada(
							self.matrizIMP[h][3], self.matrizIMP[h][1]));
				} else {
					Log.e("ServicioRest",
							"el nombre de esta vacio en la posicion" + h);
				}
			} else {
				Log.e("ServicioRest",
						"el numero de lote no es el que necesito en la posicion"
								+ h);
			}
			h++;
		}

		// for (int h = 0; h < 99; h++) {
		// if (self.matrizIMP[h][0] != null && self.matrizIMP[h][3] == numLote)
		// {
		// self.Lista_MpInspec.add(new MpInspeccionada(
		// self.matrizIMP[h][4], self.matrizIMP[h][1]));
		// }
		// }

		// correr en un nuevo hilo la UI
		runOnUiThread(new Runnable() {
			@Override
			public void run() {
				lvMpInspec.setAdapter(adaptador);
				lvMpInspec.setDividerHeight(1);
			}
		});

		// Se le aplica un Listener donde ira lo que tiene que hacer en caso de
		// que sea pulsado
		lvMpInspec.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long arg3) {

				// En caso de que la posicion seleccionada gracias a "arg2" sea
				// true que lo cambie a false

				self.tvMpInspecionada.setText(Lista_MpInspec.get(position)
						.getNameMpinspected());
				Lista_MpInspec.get(position).getNameMpinspected();

				/*
				 * Se notifica al adaptador de que el ArrayList que tiene
				 * asociado ha sufrido cambios (forzando asi a ir al metodo
				 * getView())
				 */

				adaptador.notifyDataSetChanged();

			}
		});

	}
}
